#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int Maxn=3e6+7;
int T,n;
int suf[Maxn],pos[Maxn];
int p[Maxn],porm[Maxn];
bool Tid=1;
char S[Maxn];

pair<string,int>cq[Maxn];
string ans;
char sss[Maxn];

int f[Maxn];
int qfind(int key){
	return f[key]==key?key:f[key]=qfind(f[key]); 
}
inline void Merge(int x,int y){
	int qx=qfind(x),qy=qfind(y);
	if(qx==qy) return ;
	f[qy]=qx;	
}
int col[Maxn];
bool Tid2=1;

int main(){
	freopen("string.in","r",stdin);
	freopen("string.out","w",stdout);
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		Tid=1;
		Tid2=1;
		for(int i=1;i<=n;i++){
			scanf("%d",&suf[i]);
			if(suf[i]!=n-i) Tid=0;
		}
		for(int i=1;i<2*n;i++) scanf("%d",&p[i]);
		bool wah=0;
		for(int i=1;i<2*n;i++){
			if(i&1 and !(p[i]&1)) wah=1;
			if(!(i&1) and p[i]&1) wah=1;
			if(p[i]>1) Tid2=0;
		}
		if(wah){
			puts("-1");
			continue;
		}
		
		ans.clear();
		for(int i=0;i<=n;i++) ans+='z';
		
		if(n<=8){
			bool flg=0;
			for(int i=0;i<(1<<(n-1));i++){
				char now='a';
				S[suf[1]]=now;
				for(int j=0;j<n-1;j++){
					if(i>>j&1) now++;
					S[suf[j+2]]=now;
				}
				
//				if(i==111) cout<<"hel "<<i<<" "<<(S)<<endl;
//				continue;
				for(int j=n;j;j--){
					cq[j].first=cq[j+1].first;
					cq[j].first+=S[j-1];
					cq[j].second=j-1;
				}
				for(int j=1;j<=n;j++) reverse(cq[j].first.begin(),cq[j].first.end());
				sort(cq+1,cq+n+1);
				
//				if(i==111){
//					for(int j=1;j<=n;j++) cout<<"mother "<<cq[j].second<<" "<<cq[j].first<<endl;
//				}
				
				bool tag=1;
				for(int j=1;j<=n;j++) if(suf[j]!=cq[j].second) tag=0;
				if(!tag) continue;
				for(int j=0;j<n;j++){
					int t=0;
					while(j+t<n and j-t>=0 and S[j-t]==S[j+t]) t++;
					porm[2*j+1]=2*t-1; 
				} 
				for(int j=0;j<n-1;j++){
					int t=0;
					while(j+t+1<n and j-t>=0 and S[j-t]==S[j+t+1]) t++;
					porm[2*j+2]=2*t;
				}
//				if(i==111){
//					for(int j=1;j<=2*n-1;j++) cout<<"fuck "<<porm[j]<<endl;
//				}
				for(int j=1;j<2*n;j++) if(porm[j]!=p[j]) tag=0;
				if(!tag) continue;
				string r;
				for(int j=0;j<n;j++) r+=S[j];
				ans=min(ans,r);
				flg=1;
			}
			if(!flg) printf("-1\n");
			else cout<<ans<<'\n';
			continue;	
		}
		if(Tid){
			bool tag=1;
			for(int i=1;i<=n;i++) f[i]=i;
			for(int i=1;i<=n;i++){
				int r=p[2*i-1]/2;
				if(i-r<1||i+r>n){
					tag=0;
					break;
				}
				for(int j=1;j<=r;j++) Merge(i+j,i-j);
				if(i-r-1>=1&&i+r+1<=n){
					int qx=qfind(i-r-1),qy=qfind(i+r+1);
					if(qx==qy){
						tag=0;
						break;
					}
				}
			}
			for(int i=1;i<n;i++){
				int r=p[2*i]/2;
				if(i-r<0||i+r>n){
					tag=0;
					break;
				}
				for(int j=1;j<=r;j++) Merge(i-j+1,i+j);
				if(i-r-1>=1&&i+r+1<=n){
					int qx=qfind(i-r),qy=qfind(i+r+1);
					if(qx==qy){
						tag=0;
						break;
					}
				}
			}
			
			for(int i=1;i<=n;i++){
				int r=p[2*i-1]/2;
				if(i-r<1||i+r>n){
					tag=0;
					break;
				}
				if(i-r-1>=1&&i+r+1<=n){
					int qx=qfind(i-r-1),qy=qfind(i+r+1);
					if(qx==qy){
						tag=0;
						break;
					}
				}
			}
			for(int i=1;i<n;i++){
				int r=p[2*i]/2;
				if(i-r<0||i+r>n){
					tag=0;
					break;
				}
				if(i-r-1>=1&&i+r+1<=n){
					int qx=qfind(i-r),qy=qfind(i+r+1);
					if(qx==qy){
						tag=0;
						break;
					}
				}
			}
			
			
			char now='a';
			if(!tag){
				puts("-1");
				continue;
			}
			
			sss[n]='a';
			for(int i=n-1;i;i--){
				if(qfind(i)!=qfind(i+1)) now++;
				if(now>'z'){
					tag=0;
					break;
				}
				sss[i]=now;
			} 
			if(!tag){
				puts("-1");
				continue;
			}
			for(int i=1;i<=n;i++) printf("%c",sss[i]);
			puts("");
			
			continue;
		}
		if(Tid2){
			bool tag=1;
			char now='a';
			S[suf[1]]=now;
			for(int i=2;i<=n;i++){
				if(suf[i]!=0){
					if(S[suf[i]-1]==now) now++;
					else if(suf[i]!=1){
						if(S[suf[i]-2]==now) now++;	
					}
				}
				if(suf[i]!=n-1){
					if(S[suf[i]+1]==now) now++;
					else if(suf[i]!=n-2){
						if(S[suf[i]+2]==now) now++;
					}	
				}
				if(now>'z'){
					tag=0;
					break;
				}
				S[suf[i]]=now;
			}
			for(int i=1;i<n;i++) if(S[i]==S[i-1]) tag=0;
			for(int i=1;i<n-1;i++) if(S[i-1]==S[i+1]) tag=0;
			if(!tag) puts("-1");
			else cout<<S<<"\n";
			continue;
		}
		puts("-1");
		 
	}
	return 0;
}
/*
3
8
4 6 5 3 2 0 1 7
1 0 3 0 1 0 1 0 1 0 1 0 1 0 1
8
2 5 7 0 4 3 6 1
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
8
2 1 5 4 0 3 6 7
2 1 6 8 7 3 13 13 6 3 22 17 14 14 10

1
9
8 7 6 5 4 3 2 1 0
1 2 3 2 1 0 1 0 1 0 1 0 1 0 1 0 1

1
27 
26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

1
9
4 6 5 3 2 0 1 7 8
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1


*/
